perm filename HAND.SAI[SYS,HE]1 blob
sn#004234 filedate 1972-10-20 generic text, type T, neo UTF8
00100 BEGIN
00200 IFC FALSE THENC "WAVE"
00300 DEFINE WAVE="TRUE",GRAPHICS="TRUE";
00400 ELSEC "HAND"
00500 DEFINE WAVE="FALSE",GRAPHICS="FALSE";
00600 ENDC
00700 REQUIRE -1 NEW_ITEMS;
00800 REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
00900 REQUIRE "DRIVE.REL[SYS,HE]" LOAD_MODULE;
01000 EXTERNAL SIMPLE PROCEDURE ARMPOS;
01100 EXTERNAL SIMPLE PROCEDURE HANDFN;
01200 EXTERNAL SIMPLE PROCEDURE ARMFN(INTEGER NARGS);
01300 EXTERNAL SIMPLE PROCEDURE ARMPROCEED;
01400 EXTERNAL SIMPLE PROCEDURE DOIT(INTEGER BAND,FILE);
01500 EXTERNAL SIMPLE PROCEDURE ARM_JOINT;
01600 REAL ROTAT;
01700 SAFE REAL ARRAY TRANS[1:4,1:4];
01800 INTERNAL SAFE INTEGER ARRAY ARM_MESSAGE[1:21];
01900 INTEGER IFI,I,J,MESS;
02000 BOOLEAN FRST_OPEN,AEF;
02100 BOOLEAN TEST;
02200 INTEGER N,CHAN;
02300 REAL TX,TY,TZ;
02400 INTEGER HAND;
02500 STRING FILE;
02600 INTEGER BREAK,EOF;
02700 INTEGER PTR1,PTR2,PTR3,PTR4;
02800 SAFE REAL ARRAY TH,DIR[1:6];
02900 DEFINE MP="MESSAGE";
03000 PRELOAD_WITH -180.0, -90.0, 12.0, -90.0, 90.0, 0.0;
03100 SAFE REAL ARRAY V0[1:6];
03200 LABEL EXETRUE,GGET,GET,GET1;
03300 DEFINE TTY="1",ONE_LINE="1",HEAD="2",ID="3",DEL="4";
03310 DEFINE OCTNUM="5",RSB="6",LN="7",SOME="10";
03400 DEFINE NUMS="11",NNUMS="12",DOLLAR="13",SOMETHING="14";
03500 DEFINE FREE_DATA_LENGTH="100",MAX_STACK="150";
03600 SAFE INTEGER ARRAY RELOC,STACK[1:MAX_STACK];
00100 IFC WAVE THENC
00200 REQUIRE 2000 STRING_SPACE;
00300 REQUIRE "HASH06.REL[SYS,HE]" LOAD_MODULE;
00400 EXTERNAL SIMPLE INTEGER PROCEDURE HASH(STRING S);
00500 EXTERNAL SIMPLE INTEGER PROCEDURE REHASH;
00600 STRING LINE_NO,S;
00700 SAFE REAL ARRAY XT[1:4,1:4];
00800 SAFE REAL ARRAY XV,YV[1:4];
00900 STRING ARRAY MACRO_FORMAL,MACRO_NAME,MACRO_SOURCE,MACRO_DEFN,FILE_NAME[1:15];
01000 SAFE INTEGER ARRAY MAC_TOP[0:14];
01100 INTEGER FMN,MAC_EOF,MAC,MAC_FREE;
01200 DEFINE MAX_PAR="30";
01300 SAFE STRING ARRAY MAC_PAR[1:MAX_PAR];
01400 DEFINE MAX_LABELS="100";
01500 STRING ARRAY LABEL_LINE,LABELS[1:MAX_LABELS];
01600 INTEGER ARRAY BBEG,LLAB[1:15];
01700 INTEGER FREEL;
01800 INTEGER ARRAY PTRS[1:MAX_LABELS];
01900 STRING ARRAY CODE_LINE,REF[1:MAX_STACK];
02000 STRING ARRAY FUNNAM[0:'77];
02100 INTEGER ARRAY FUNNUM[0:'77];
02200 STRING ARRAY VECTNAM[0:'77];
02300 STRING ARRAY TRANSNAM[0:'77];
02400 INTEGER ARRAY TRANSNUM[0:'77];
02500 INTEGER ARRAY VECTNUM[0:'77];
02550 SAFE STRING ARRAY SAVE_NAME[1:10];INTEGER MSN;
02600 SAFE REAL ARRAY DATA_BASE[0:FREE_DATA_LENGTH,1:3];
02700 INTEGER FREE_DATA;
02800 SIMPLE STRING PROCEDURE SIMIO(REFERENCE INTEGER BR);
02900 BEGIN STRING S;
03000 IF MAC
03100 THEN BEGIN S←SCAN(MACRO_SOURCE[MAC],BR,BREAK);
03200 MAC_EOF←¬(LENGTH(MACRO_SOURCE[MAC]) ∨ LENGTH(S)) END
03300 ELSE S←INPUT(CHAN,BR);
03400 RETURN(S) END"SIMIO";
03500
00100 SIMPLE INTEGER PROCEDURE GETNAME(BOOLEAN NUM;REFERENCE STRING S;STRING ARRAY NAME);
00200 BEGIN LABEL L1;
00300 INTEGER I;
00400 L1: IF NUM THEN SIMIO(NUMS) ELSE SIMIO(HEAD);
00500 IF MAC_EOF
00600 THEN BEGIN
00700 FOR I←LLAB[MAC] STEP 1 UNTIL FREEL
00800 DO FOR J←BBEG[MAC] STEP 1 UNTIL PTR3
00900 DO IF EQU(REF[J],LABELS[I])
01000 THEN BEGIN
01100 START_CODE
01200 MOVE 1,STACK;
01300 ADD 1,J;
01400 HRRE 1,-1(1);
01500 MOVEM 1,N END;
01600 N←PTRS[I]-J+N;
01700 REF[J]←NULL;
01800 IF N+J<1 ∨ N+J>PTR3+1
01900 THEN BEGIN
02000 OUTSTR(CODE_LINE[J]&"JUMP OUT OF RANGE"&'15&'12);
02100 N←PTR3+1-J END;
02200 STACK[J]←(N LAND '777777) LOR '102000000 END;
02300 MAC_FREE←MAC_TOP[MAC];
02400 MAC←MAC-1;
02500 MAC_EOF←0;
02600 IF ¬MAC ∧ CHAN=1 THEN BEGIN LINE_NO←NULL;OUTSTR("*")END;
02700 GO TO L1 END;
02800 IF EOF THEN BEGIN RELEASE(CHAN);
02900 CHAN←CHAN-1;
03000 IF ¬MAC ∧ CHAN=1 THEN BEGIN LINE_NO←NULL;OUTSTR("*")END;
03100 GO TO L1; END;
03200 IF BREAK=-1
03300 THEN BEGIN LINE_NO←SIMIO(LN);
03400 GO TO L1 END;
03500 IF BREAK=";" THEN BEGIN SIMIO(ONE_LINE); GO TO L1 END;
03600 IF BREAK="$"
03700 THEN BEGIN I←INTSCAN(S←SIMIO(NNUMS),J);
03800 I←I+MAC_TOP[MAC];
03900 IF I<1 ∨ I> MAC_FREE
04000 THEN BEGIN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"MACRO PARAMETER OUT OF RANGE"&'15&'12);
04100 GO TO L1 END;
04200 S←MAC_PAR[I] END
04300 ELSE S←IF NUM THEN SIMIO(NNUMS) ELSE SIMIO(ID);
04400 IF NUM THEN RETURN(-1);
04500 IF BREAK=":"
04600 THEN BEGIN
04700 FOR I←LLAB[CHAN] STEP 1 UNTIL FREEL
04800 DO IF EQU(S,LABELS[I])
04900 THEN BEGIN OUTSTR(FILE_NAME[CHAN]&LINE_NO&S&" MULTIPLY DEFINED LABEL"&'15&'12);
05000 GO TO L1 END;
05100 LABELS[FREEL←FREEL+1]←S;
05200 LABEL_LINE[FREEL]←FILE_NAME[CHAN]&LINE_NO;
05300 PTRS[FREEL]←PTR3+1;
05400 GO TO L1 END;
05500 I←HASH(S);
05600 WHILE LENGTH(NAME[I])
05700 DO BEGIN IF EQU(S,NAME[I]) THEN DONE;
05800 I←REHASH END;
05900 RETURN(I) END;
06000
00100 FORWARD SIMPLE PROCEDURE CONSTRUCT(REAL ARRAY T,E);
00200
00300 SIMPLE INTEGER PROCEDURE INTERN(STRING S;STRING ARRAY NAME);
00400 BEGIN INTEGER I;
00500 I←HASH(S);
00600 WHILE LENGTH(NAME[I])
00700 DO BEGIN IF EQU(S,NAME[I]) THEN RETURN(I);
00800 I←REHASH END;
00900 NAME[I]←S;
01000 RETURN(I) END;
01100
01200 DEFINE SAY_WAIT="IF ¬MAC ∧ CHAN=1 THEN OUTSTR(WAIT&'15&'12)";
01300
01400 BOOLEAN SIMPLE PROCEDURE READT(REAL ARRAY T;REFERENCE STRING S;STRING MESS);
01500 BEGIN INTEGER I;
01600 SAFE OWN REAL ARRAY E[1:6];
01700 I←GETNAME(FALSE,S,TRANSNAM);
01800 IF LENGTH(TRANSNAM[I])
01900 THEN BEGIN ARRBLT(E[1],DATA_BASE[TRANSNUM[I],1],6);
02000 CONSTRUCT(T,E);
02100 RETURN(TRUE) END;
02200 OUTSTR(FILE_NAME[CHAN]&LINE_NO&MESS&'15&'12);
02300 RETURN(FALSE) END;
02400
02500 BOOLEAN SIMPLE PROCEDURE READV(REAL ARRAY V;REFERENCE STRING S;STRING MESS);
02600 BEGIN INTEGER I;
02700 I←GETNAME(FALSE,S,VECTNAM);
02800 IF LENGTH(VECTNAM[I])
02900 THEN BEGIN ARRBLT(V[1],DATA_BASE[VECTNUM[I],1],3);
03000 V[4]←1;
03100 RETURN(TRUE) END;
03200 OUTSTR(FILE_NAME[CHAN]&LINE_NO&MESS&'15&'12);
03300 RETURN(FALSE) END;
03400
03500 STRING WAIT,OFILE,SL;
03600 SAFE REAL ARRAY TT1[1:4,1:4];
03700 PRELOAD_WITH 20,30,1,180,90,0; SAFE REAL ARRAY ANEW[1:6];
03800 IFC GRAPHICS THENC
03900 REQUIRE"DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
04000 ENDC
04100 STRING FUNCTION,S11,SM,DFILE;
04200 PRELOAD_WITH 100.0, 100.0, 100.0, 100.0, 100.0, 100.0;
04300 SAFE REAL ARRAY THFAC[1:6];
04400 ENDC
00100 REAL R;
00200 SAFE REAL ARRAY VT,VT1,VT2[1:4];
00300 PRELOAD_WITH [2] 0.0, [2] 1.0;
00400 SAFE REAL ARRAY UZ[1:4];
00500 SAFE REAL ARRAY ST[1:6];
00600 INTEGER NMASK,TIP,PAD,HIT,LL,UL,MODULUS,PTR,TIME,INDEX,BP;
00700 REAL FACTOR;
00800 PRELOAD_WITH 0;
00900 SAFE INTEGER ARRAY BUFFER[0:100];
01000 IFC WAVE THENC
01100 ENDC
01200
01300 REQUIRE "TRAJ.SAI" SOURCE_FILE;
01400
00100 IFC WAVE THENC
00200 SIMPLE PROCEDURE CONSTRUCT(REAL ARRAY T,E);
00300 BEGIN
00400 REAL SI1,SI2,SI3,CO1,CO2,CO3;
00500 T[1,4]←E[1]*TSX;
00600 T[2,4]←E[2]*TSY;
00700 T[3,4]←E[3];
00800 SI1←SIND(E[4]);CO1←COSD(E[4]);
00900 SI2←SIND(E[5]);CO2←COSD(E[5]);
01000 SI3←SIND(E[6]);CO3←COSD(E[6]);
01100 T[1,1]←-SI1*SI2*CO3+CO1*SI3;
01200 T[1,2]← SI1*SI2*SI3+CO1*CO3;
01300 T[2,1]← CO1*SI2*CO3+SI1*SI3;
01400 T[2,2]←-CO1*SI2*SI3+SI1*CO3;
01500 T[1,3]← SI1*CO2;
01600 T[2,3]←-CO1*CO2;
01700 T[3,1]←-CO2*CO3;
01800 T[3,2]← CO2*SI3;
01900 T[3,3]←-SI2;
02000 T[4,1]←T[4,2]←T[4,3]←0;
02100 T[4,4]←1;
02200 END;
02300
02400 ENDC
00100 FORMAT_POINTER←-1;
00200 FREE_ARM[0,1]←0;
00300 AEF←ARM_EXECUTE←FALSE;
00400 FOR I←1 STEP 1 UNTIL 6 DO FORCE_ARM[I]←0;
00500 PUSH_FORMAT(8,4);
00600 ARM_SEGMENT←0;
00700 ARM_MOTION←0;
00800 FAST←TRUE;
00900 FOR I←0 STEP 1 UNTIL '37 DO BANDS[I]←NULL;
01000 NEXT_BAND←0;
01100 STOP_ON_TOUCH←FALSE;
01200 FOR I←1 STEP 1 UNTIL 6 DO MMOVE(A[SQAR(I)],A[SQAR(I)]);
01300
01400 FILE←"ARM";
01500 MMOVE(Q[0],Q[0]);
01600 MMOVE(Q[17],Q[17]);
01700 FOR I←1 STEP 1 UNTIL 3 DO DEPART_ARM[I]←ARRIVE_ARM[I]←IF I=3 THEN 3.0 ELSE 0.0;
01800 DEPART_ARM[4]←ARRIVE_ARM[4]←1.0;
01900 FOR I←1 STEP 1 UNTIL 6 DO BEGIN
02000 N←SQAR(I);
02100 MMOVE(JMAT[N],JMAT[N])END ;
02200 DO BEGIN
02300 ARM_POSITION;
02400 IF ARM_STATUS THEN
02500 BEGIN OUTSTR("HAND ERROR "&CVOS(ARM_STATUS)&"
02600 CHECK PDP-6 AND TYPE C/R"&CRLF);
02700 INCHWL;
02800 END;
02900 END UNTIL ¬ARM_STATUS;
03000 ARRTRAN(LAST_ARM,ARM_VECTOR);
03100 PUT_DATA(0,0,"HAND");
03200 YES_HAND←-1;
03300 IFC ¬WAVE THENC
03400 OUTSTR(" ***** HAND INITIALIZED *****"&'15&'12);
03500 WHILE TRUE DO QUEUE('600, GET_ENTRY('120,NULL,"HAND",NULL));
00100 ELSEC
00200 WAIT←"O.K.";
00300 OPEN(TTY,"TTY",0,2,0,120,BREAK,EOF);
00400 FILE←NULL;
00500 FREEL←0;
00600 FOR I←1 STEP 1 UNTIL 15 DO LLAB[I]←1;
00700 OFILE←"WAVE";
00800 SETBREAK(ONE_LINE,'12,'15,"IN");
00900 SETBREAK(SOME,"0123456789.@+-;$ABCDEFGHIJKLMNOPQRSTUVWXYZ",NULL,"ILRD");
00950 SETBREAK(SOMETHING,"0123456789.@+-;$ABCDEFGHIJKLMNOPQRSTUVWXYZ"&'12,'15,"ILRD");
01000 SETBREAK(HEAD,"$;ABCDEFGHIJKLMNOPQRSTUVWXYZ",NULL,"ILRD");
01100 SETBREAK(ID,"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_",NULL,"XN");
01200 SETBREAK(RSB,"]",NULL,"IAN");
01300 SETBREAK(DEL,"() ,;: ",NULL,"IN");
01400 SETBREAK(NUMS,"0123456789.@+-$;",NULL,"ILR");
01500 SETBREAK(NNUMS,"$0123456789.@+-",NULL,"XL");
01600 SETBREAK(DOLLAR,"$",NULL,"I");
01700 SETBREAK(LN," ",NULL,"IA");
01800 NMASK←'777777774000;
01900 CHAN←TTY;
02000 MSN←FMN←MAC←MAC_EOF←EOF←MAC_FREE←0;
02100 FUNNUM[INTERN("DO",FUNNAM)]←0;
02200 FUNNUM[INTERN("REQUIRE",FUNNAM)]←1;
02300 FUNNUM[INTERN("TRANS",FUNNAM)]←2;
02400 FUNNUM[INTERN("VECT",FUNNAM)]←3;
02500 FUNNUM[INTERN("BEGIN",FUNNAM)]←4;
02600 FUNNUM[INTERN("PARK",FUNNAM)]←5;
02700 FUNNUM[INTERN("MOVE",FUNNAM)]←6;
02800 FUNNUM[INTERN("STEP",FUNNAM)]←7;
02900 FUNNUM[INTERN("DRAW",FUNNAM)]←8;
03000 FUNNUM[INTERN("FREE",FUNNAM)]←9;
03100 FUNNUM[INTERN("SPIN",FUNNAM)]←10;
03200 FUNNUM[INTERN("FORCE",FUNNAM)]←11;
03300 FUNNUM[INTERN("STOP",FUNNAM)]←12;
03400 FUNNUM[INTERN("OPEN",FUNNAM)]←13;
03500 FUNNUM[INTERN("SKIPE",FUNNAM)]←14;
03600 FUNNUM[INTERN("JUMP",FUNNAM)]←15;
03700 FUNNUM[INTERN("CLOSE",FUNNAM)]←16;
03800 FUNNUM[INTERN("CENTER",FUNNAM)]←17;
03900 FUNNUM[INTERN("PLACE",FUNNAM)]←18;
04000 FUNNUM[INTERN("CHANGE",FUNNAM)]←19;
04100 FUNNUM[INTERN("DRIVE",FUNNAM)]←20;
04200 FUNNUM[INTERN("WAIT",FUNNAM)]←21;
04300 FUNNUM[INTERN("MERGE",FUNNAM)]←22;
04400 FUNNUM[INTERN("SAVE",FUNNAM)]←23;
04500 FUNNUM[INTERN("RESTORE",FUNNAM)]←24;
04600 FUNNUM[INTERN("TOUCH",FUNNAM)]←25;
04700 FUNNUM[INTERN("CONO",FUNNAM)]←26;
04800 FUNNUM[INTERN("END",FUNNAM)]←27;
04900 FUNNUM[INTERN("FLUSH",FUNNAM)]←28;
05000 FUNNUM[INTERN("GO",FUNNAM)]←29;
05100 FUNNUM[INTERN("PROTOTYPE",FUNNAM)]←30;
05200 FUNNUM[INTERN("FILE",FUNNAM)]←31;
05300 FUNNUM[INTERN("I",FUNNAM)]←32;
05400 FUNNUM[INTERN("MOVE_INSTANCE",FUNNAM)]←33;
05500 FUNNUM[INTERN("LINK",FUNNAM)]←34;
05600 FUNNUM[INTERN("GRASP",FUNNAM)]←35;
05700 FUNNUM[INTERN("WEIGHT",FUNNAM)]←36;
05800 FUNNUM[INTERN("TIME",FUNNAM)]←37;
05900 FUNNUM[INTERN("POSITION",FUNNAM)]←38;
06000 FUNNUM[INTERN("SKIPN",FUNNAM)]←39;
06100 FUNNUM[INTERN("SKIPS",FUNNAM)]←40;
06200 FUNNUM[INTERN("DEFINE",FUNNAM)]←41;
06300 FUNNUM[INTERN("DUMP",FUNNAM)]←42;
06350 FUNNUM[INTERN("SET",FUNNAM)]←43;
06400 IFC GRAPHICS THENC FUNNUM[INTERN("DISP",FUNNAM)]←44;ENDC
06500 VECTNUM[INTERN("SWEEP",VECTNAM)]←0;
06600 VECTNUM[INTERN("LIFT",VECTNAM)]←0;
06700 VECTNUM[INTERN("REACH",VECTNAM)]←0;
06800 VECTNUM[INTERN("TURN",VECTNAM)]←0;
06900 VECTNUM[INTERN("TWIST",VECTNAM)]←0;
07000 VECTNUM[INTERN("TILT",VECTNAM)]←0;
07100 FREE_DATA←1;
07200 OUTSTR("WAVE READY!
07300 DO YOU WANT THE FILES SAVED? Y OR N
07400 ");
07500 DO BEGIN
07600 S←INCHWL;
07700 IF S="Y" THEN FAST←FALSE;
07800 IF S="N" THEN FAST←TRUE;
07900 END UNTIL S="Y" ∨ S="N";
08000 GO TO GET1;
08100
08200 GET:SIMIO(ONE_LINE);
08300 GET1:SETFORMAT(7,2);
08400 GGET:
08500 IF AEF ∧ ARM_STATUS THEN OUTSTR("ARM_STATUS"&CVOS(ARM_STATUS)&CRLF);
08600 IF ¬MAC ∧ CHAN=1 THEN OUTSTR("*"&CRLF);
08700 AEF←FALSE;
08800 I←GETNAME(FALSE,S,FUNNAM);
08900 IF LENGTH(FUNNAM[I]) THEN EXETRUE:CASE FUNNUM[I] OF BEGIN
00100 BEGIN "DOIT"
00200 ARM_EXECUTE←AEF←TRUE;
00300 IF BREAK≠'15
00400 THEN BEGIN I←GETNAME(FALSE,S,FUNNAM);
00500 IF LENGTH(FUNNAM[I]) THEN GO TO EXETRUE END
00600 ELSE S←OFILE;
00700 SAY_WAIT;
00800 IF LENGTH(FILE) THEN BEGIN
00900 CLOSE_TRAJECTORY;
01000 FILE←NULL;
01100 END;
01200 DO_IT(S);
01300 GO TO GET1;
01400 END"DOIT";
01500
01600 BEGIN "REQUIRE"
01700 SIMIO(HEAD);
01800 FILE_NAME[CHAN+1]←(S←SIMIO(ID))&'11;
01900 IF BREAK="." THEN S←S&"."&SIMIO(ID) ELSE S←S&".HAL";
02000 IF BREAK="[" THEN S←S&"["&SIMIO(RSB);
02100 OPEN(CHAN+1,"DSK",0,2,0,120,BREAK,EOF);
02200 LOOKUP(CHAN+1,S,EOF);
02300 IF EOF≠0 THEN BEGIN OUTSTR(FILE_NAME[CHAN]&" "&LINE_NO&"FILE NOT FOUND"&CRLF);
02400 RELEASE(CHAN+1);GO TO GET END;
02450 IF CHAN=1 ∧ ¬MAC THEN SAY_WAIT;
02500 CHAN←CHAN+1;
02600 GO TO GET1;
02700 END "REQUIRE";
02800
02900
03000 BEGIN "TRANS"
03100 INTEGER PTR;
03200 SAFE OWN REAL ARRAY E[1:6];
03300 SAFE OWN REAL ARRAY VT,VTT[1:4];
03400 PTR←GETNAME(FALSE,S,TRANSNAM);
03500 IF ¬LENGTH(TRANSNAM[PTR])
03600 THEN BEGIN
03700 IF FREE_DATA+2>FREE_DATA_LENGTH
03800 THEN BEGIN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"NO FREE DATA"&CRLF);GO TO GET END;
03900 TRANSNAM[PTR]←S;
04000 TRANSNUM[PTR]←FREE_DATA;
04100 ARRBLT(E[1],ANEW[1],6);
04200 FREE_DATA←FREE_DATA+2 END
04300 ELSE ARRBLT(E[1],DATA_BASE[TRANSNUM[PTR],1],6);
04400 IF ¬MAC ∧ CHAN=1
04500 THEN BEGIN OUTSTR(" X Y Z O A T"&CRLF);
04600 FOR I←1 STEP 1 UNTIL 6 DO OUTSTR(CVF(E[I]));
04700 OUTSTR(CRLF&"CHANGE?"&CRLF);
04800 SIMIO(ONE_LINE);
04900 S←SIMIO(ONE_LINE);
05000 FOR I←1 STEP 1 UNTIL 6 DO
05100 IF LENGTH(S) THEN BEGIN
05200 SL←SCAN(S,DEL,IFI);
05300 R←REALSCAN(SL,IFI);
05400 IF IFI≠-1 THEN E[I]←R;
05500 END;
05600 END ELSE FOR I←1 STEP 1 UNTIL 6 DO BEGIN
05700 GETNAME(TRUE,S,VECTNAM);
05800 E[I]←REALSCAN(S,BREAK) END;
05900 ARRBLT(DATA_BASE[TRANSNUM[PTR],1],E[1],6);
06000 IF ¬MAC ∧ CHAN=1
06100 THEN BEGIN CONSTRUCT(TT1,E);
06200 TT1[1,4]←TT1[1,4]/TSX;
06300 TT1[2,4]←TT1[2,4]/TSY;
06400 PMAT(NULL,TT1) END;
06500 GO TO GET1;
06600 END"TRANS";
06700
06800 BEGIN "VECT"
06900 INTEGER PTR;
07000 PTR←GETNAME(FALSE,S,VECTNAM);
07100 IF ¬LENGTH(VECTNAM[PTR])
07200 THEN BEGIN
07300 IF FREE_DATA+1>FREE_DATA_LENGTH
07400 THEN BEGIN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"NO FREE DATA"&CRLF);GO TO GET END;
07500 VECTNAM[PTR]←S;
07600 VECTNUM[PTR]←FREE_DATA;
07700 FOR I←1 STEP 1 UNTIL 3 DO XV[I]←0;
07800 FREE_DATA←FREE_DATA+1 END
07900 ELSE ARRBLT(XV[1],DATA_BASE[VECTNUM[PTR],1],3);
08000 XV[4]←1;
08100 IF ¬MAC ∧ CHAN=1
08200 THEN BEGIN PVECT(NULL,XV);
08300 OUTSTR("CHANGE ?"&CRLF);
08400 SIMIO(ONE_LINE);
08500 S←SIMIO(ONE_LINE);
08600 FOR I←1 STEP 1 UNTIL 3 DO
08700 IF LENGTH(S) THEN BEGIN
08800 SL←SCAN(S,DEL,IFI);
08900 R←REALSCAN(SL,IFI);
09000 IF IFI≠-1 THEN XV[I]←R;
09100 END;
09200 END ELSE FOR I←1 STEP 1 UNTIL 3 DO BEGIN
09300 GETNAME(TRUE,S,VECTNAM);
09400 XV[I]←REALSCAN(S,BREAK) END;
09500 ARRBLT(DATA_BASE[VECTNUM[PTR],1],XV[1],3);
09600 IF ¬MAC ∧ CHAN=1 THEN PVECT(NULL,XV);
09700 GO TO GET1;
09800 END "VECT";
09900
00100 BEGIN "BEGIN"
00200 IF FILE THEN CLOSE_TRAJECTORY ;
00300 GETNAME(FALSE,FILE,VECTNAM);
00400 SAY_WAIT;
00500 START_TRAJECTORY(FILE,0);
00600 END"BEGIN";
00700
00800 BEGIN "PARK"
00900 SAY_WAIT;
01000 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
01100 PARK_ARM;
01200 END"PARK";
01300
01400 BEGIN "MOVE"
01410 REAL DIST,DEG;
01500 IF READT(TT1,S,"MOVE - "&S&" TRANSFORM DOSN'T EXIST")
01600 THEN BEGIN SIMIO(SOMETHING);
01700 IF BREAK≠'12 ∧ BREAK≠";" THEN BEGIN
01800 IF ¬READV(XV,S,"DX DY DZ DOSN'T EXIST") THEN GO TO GET;
01900 J←0;
02000 IF EQU(S,"SWEEP")THEN J←2;
02100 IF EQU(S,"REACH")THEN J←3;
02200 IF EQU(S,"LIFT")THEN J←1;
02300 IF J THEN FOR I←1 STEP 1 UNTIL 3 DO XV[I]←TT1[J,I];
02400 GETNAME(TRUE,S,FUNNAM);
02500 DIST←REALSCAN(S,BREAK);
02600 IF ¬READV(YV,S,"AXIS DOSN'T EXIST")THEN GO TO GET;
02700 J←0;
02800 IF EQU(S,"TURN")THEN J←1;
02900 IF EQU(S,"TWIST")THEN J←3;
03000 IF EQU(S,"TILT")THEN J←2;
03100 IF J THEN FOR I←1 STEP 1 UNTIL 3 DO YV[I]←TT1[J,I];
03200 GETNAME(TRUE,S,FUNNAM);
03300 DEG←REALSCAN(S,BREAK);
03400 SCALE(XV,XV,DIST);
03410 REDUCE(XV);
03415 XV[1]←XV[1]*TSX;XV[2]←XV[2]*TSY;
03420 FOR J←1 STEP 1 UNTIL 3 DO TT1[J,4]←TT1[J,4]+XV[J];
03430 IF DEG ∧ MAGNITUDE(YV) THEN BEGIN
03450 FOR I←1 STEP 1 UNTIL 3 DO BEGIN
03460 CVV(XV,TT1,I);
03470 REVOLVE(XV,YV,DEG);
03480 CVC(TT1,I,XV) END;
03490 END;
03495 END;
03500 SAY_WAIT;
03600 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
03700 MOVE_ARM(TT1,ARM_PLAN);
03800 IF ¬ARM_PLAN THEN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"UNABLE TO MOVE"&CRLF)END
03900 END"MOVE";
04000
04100 BEGIN"STEP"
04200 GETNAME(TRUE,S,FUNNAM);
04300 I←INTSCAN(S,BREAK);
04400 GETNAME(TRUE,S,FUNNAM);
04500 R←REALSCAN(S,BREAK);
04600 GETNAME(TRUE,S,FUNNAM);
04700 J←INTSCAN(S,BREAK);
04800 SAY_WAIT;
04900 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
05000 IF 1≤ I ≤6 THEN STEP_ARM(I,R,J) ELSE OUTSTR(FILE_NAME[CHAN]&LINE_NO&"SORRY"&CRLF);
05100 END"STEP";
05200
05300 BEGIN "DRAW"
05400 INTEGER I;
05500 SAFE OWN REAL ARRAY PROFILE[1:5,1:4];
05600 SAFE OWN REAL ARRAY DP[1:4];
05700 EXTERNAL SIMPLE PROCEDURE MOVEV(REFERENCE REAL R;REAL ARRAY S);
05800 IF ¬MAC ∧ CHAN=1 THEN BEGIN OUTSTR("POSITION,ROTATION,ANGLE
05900 CRANK,AXIS,DEGREES
06000 TIME,LOOP"&CRLF);
06100 SIMIO(ONE_LINE) END;
06200 IF ¬READV(XV,S,"NEW POSITION MISSING") THEN GO TO GET;
06300 MOVEV(DP[1],XV);
06400 REDUCE(DP);
06500 DP[1]←DP[1]*TSX;
06600 DP[2]←DP[2]*TSY;
06700 MOVEV(PROFILE[1,1],DP);
06800 IF ¬READV(YV,S,"ROTATION AXIS MISSING") THEN GO TO GET;
06900 MOVEV(PROFILE[2,1],YV);
07000 GETNAME(TRUE,S,FUNNAM);
07100 PROFILE[3,1]←REALSCAN(S,BREAK);
07200 IF ¬(READV(XV,S,"CRANK MISSING") ∧ READV(YV,S,"AXIS MISSING"))THEN GO TO GET;
07300 GETNAME(TRUE,S,FUNNAM);
07400 PROFILE[3,2]←REALSCAN(S,BREAK);
07500 MOVEV(PROFILE[4,1],XV);
07600 MOVEV(PROFILE[5,1],YV);
07700 GETNAME(TRUE,S,FUNNAM);
07800 ARM_STAT[2]←INTSCAN(S,BREAK);
07900 GETNAME(TRUE,S,FUNNAM);
08000 ARM_STAT[3]←INTSCAN(S,BREAK);
08100 IF ARM_STAT[3] ∧ ¬(ABS(PROFILE[3,2])=360 ∨ ABS(PROFILE[3,1])=360)
08200 THEN BEGIN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"UNLOOPABLE
08300 "); GO TO GET END;
08400 SAY_WAIT;
08500 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
08600 DRAW_ARM(ARM_STAT,PROFILE);
08700 IF ARM_STAT[1] THEN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"DRAW - SORRY"&CVOS(ARM_STAT[1])&CRLF);
08800 END"DRAW";
08900
00100 BEGIN"FREE"
00200 GETNAME(TRUE,S,FUNNAM);
00300 J←INTSCAN(S,BREAK);
00400 FOR I←FREE_ARM[0,1]+1 STEP 1 UNTIL FREE_ARM[0,1]+J DO
00500 BEGIN
00600 FREE_ARM[I,1]←0;ARRBLT(FREE_ARM[I,2],FREE_ARM[I,1],5);
00700 IF READV(XV,S,"MISSING FREE")
00800 THEN BEGIN REDUCE(XV);
00900 ARRBLT(FREE_ARM[I,1],XV[1],3)END;
01000 END;
01100 FREE_ARM[0,1]←FREE_ARM[0,1]+J;
01200 END"FREE";
01300
01400 BEGIN"SPIN"
01500 GETNAME(TRUE,S,FUNNAM);
01600 J←INTSCAN(S,BREAK);
01700 FOR I←FREE_ARM[0,1]+1 STEP 1 UNTIL FREE_ARM[0,1]+J DO
01800 BEGIN
01900 FREE_ARM[I,1]←0;ARRBLT(FREE_ARM[I,2],FREE_ARM[I,1],5);
02000 IF READV(XV,S,"MISSING FREE")
02100 THEN BEGIN REDUCE(XV);
02200 ARRBLT(FREE_ARM[I,4],XV[1],3)END;
02300 END;
02400 FREE_ARM[0,1]←FREE_ARM[0,1]+J;
02500 END"SPIN";
02600
02700 BEGIN"FORCE"
02800 IF (READV(XV,S,"MISSING FORCE") ∧ READV(YV,S,"MISSING MOMENT"))
02900 THEN BEGIN REDUCE(XV);
03000 ARRBLT(FORCE_ARM[1],XV[1],3);
03100 REDUCE(YV);
03200 ARRBLT(FORCE_ARM[4],YV[1],3) END;
03300 END"FORCE";
03400
03500 BEGIN "STOP"
03600 IF (READV(XV,S,"MISSING FORCE") ∧ READV(YV,S,"MISSING MOMENT"))
03700 THEN BEGIN SAY_WAIT;
03800 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
03900 STOP_ARM(XV,YV,ARM_PLAN);
04000 IF ¬ARM_PLAN THEN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"SORRY"&CRLF) END;
04100 END"STOP";
04200
00100 BEGIN"OPEN_HAND"
00200 GETNAME(TRUE,S,FUNNAM);
00300 R←REALSCAN(S,BREAK);
00400 SAY_WAIT;
00500 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
00600 OPEN_HAND(R);
00700 END"OPEN_HAND";
00800
00900 BEGIN"SKIPE"
01000 STRING SL;
01100 SL←SIMIO(ONE_LINE);
01200 I←CVO(SL);
01300 SAY_WAIT;
01400 ARM_SKIPE(I);
01500 GO TO GET1
01600 END"SKIPE";
01700
01800 BEGIN"JUMP"
01900 STRING SC;
02000 CODE_LINE[PTR3+1]←LINE_NO;
02100 S←SC←SIMIO(ONE_LINE);
02200 SCAN(SC,HEAD,J);
02300 IF LENGTH(REF[PTR3+1]←SCAN(SC,ID,J))
02400 THEN BEGIN SC←BREAK&SC;
02500 I←INTSCAN(SC,J) END ELSE I←INTSCAN(S,J);
02600 SAY_WAIT;
02700 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
02800 ARM_JMP(I);
02900 GO TO GET1;
03000 END"JUMP";
03100
03200 BEGIN "CLOSE_HAND"
03300 GETNAME(TRUE,S,FUNNAM);
03400 R←REALSCAN(S,BREAK);
03500 SAY_WAIT;
03600 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
03700 CLOSE_HAND(R);
03800 END"CLOSE_HAND";
03900
04000 BEGIN "CENTER"
04100 SAFE OWN REAL ARRAY DIR[1:4];
04200 GETNAME(TRUE,S,FUNNAM);
04300 R←REALSCAN(S,BREAK);
04400 SAY_WAIT;
04500 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
04600 CENTER_HAND(R);
04700 END"CENTER";
04800
04900 BEGIN "PLACE"
05000 SAY_WAIT;
05100 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
05200 PLACE_ARM;
05300 END"PLACE";
05400
00100 BEGIN"CHANGE"
00200 REAL DIST,DEG;
00300 INTEGER TIME;
00400 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
00500 IF ¬READV(XV,S,"DX DY DZ DOSN'T EXIST") THEN GO TO GET;
00600 J←0;
00700 IF EQU(S,"SWEEP")THEN J←2;
00800 IF EQU(S,"REACH")THEN J←3;
00900 IF EQU(S,"LIFT")THEN J←1;
01000 IF J THEN IF AEF THEN FOR I←1 STEP 1 UNTIL 3 DO XV[I]←ARM_LINK[6,J,I]
01100 ELSE CVV(XV,LAST_TRANS,J);
01200 GETNAME(TRUE,S,FUNNAM);
01300 DIST←REALSCAN(S,BREAK);
01400 IF ¬READV(YV,S,"AXIS DOSN'T EXIST")THEN GO TO GET;
01500 J←0;
01600 IF EQU(S,"TURN")THEN J←1;
01700 IF EQU(S,"TWIST")THEN J←3;
01800 IF EQU(S,"TILT")THEN J←2;
01900 IF J THEN IF AEF THEN FOR I←1 STEP 1 UNTIL 3 DO YV[I]←ARM_LINK[6,J,I]
02000 ELSE CVV(YV,LAST_TRANS,J);
02100 GETNAME(TRUE,S,FUNNAM);
02200 DEG←REALSCAN(S,BREAK);
02300 GETNAME(TRUE,S,FUNNAM);
02400 TIME←INTSCAN(S,BREAK);
02500 SAY_WAIT;
02600 CHANGE_ARM(XV,DIST,YV,DEG,TIME,ARM_PLAN);
02700 IF ¬ARM_PLAN THEN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"CAREFUL"&CRLF);
02800 END"CHANGE";
02900
03000 BEGIN"DRIVE"
03100 GETNAME(TRUE,S,FUNNAM);
03200 I←INTSCAN(S,BREAK);
03300 GETNAME(TRUE,S,FUNNAM);
03400 R←REALSCAN(S,BREAK);
03500 GETNAME(TRUE,S,FUNNAM);
03600 J←INTSCAN(S,BREAK);
03700 SAY_WAIT;
03800 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
03900 DRIVE_ARM(I,R,J,ARM_PLAN);
04000 IF ¬ARM_PLAN THEN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"SORRY"&CRLF);
04100 END"DRIVE";
04200
04300 BEGIN"WAIT"
04400 SAY_WAIT;
04500 WAIT_ARM;
04600 END"WAIT";
04700
04800 BEGIN"MERGE"
04900 SAY_WAIT;
05000 MERGE_ARM;
05100 END"MERGE";
05200
05300 BEGIN"SAVE"
05350 LABEL L1;
05400 GETNAME(FALSE,S,VECTNAM);
05410 FOR I←1 STEP 1 UNTIL MSN DO IF EQU(S,SAVE_NAME[I]) THEN GO TO L1;
05420 FOR I←1 STEP 1 UNTIL 10 DO IF ¬LENGTH(SAVE_NAME[I])
05430 THEN BEGIN SAVE_NAME[I]←S;
05435 IF I>MSN THEN MSN←I;
05440 GO TO L1 END;
05450 OUTSTR(FILE_NAME[CHAN]&LINE_NO&"NO FREE SAVE CELL"&CRLF);
05460 GO TO GET;
05600 L1: SAY_WAIT;
05650 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
05700 ARM_SAVE(I);
05800 END"SAVE";
05900
06000 BEGIN"RESTORE"
06010 LABEL L1;
06100 GETNAME(FALSE,S,VECTNAM);
06110 FOR I←1 STEP 1 UNTIL MSN DO IF EQU(S,SAVE_NAME[I]) THEN GO TO L1;
06120 OUTSTR(FILE_NAME[CHAN]&LINE_NO&S&" NOT SAVE CELL"&CRLF);
06130 GO TO GET;
06140 L1: GETNAME(TRUE,S,FUNNAM);
06145 IF INTSCAN(S,BREAK)
06150 THEN BEGIN SAVE_NAME[I]←NULL;
06160 IF I=MSN THEN MSN←MSN-1 END;
06300 SAY_WAIT;
06350 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
06400 ARM_RESTORE(I);
06500 END"RESTORE";
06600
06700 BEGIN "TOUCH"
06800 GETNAME(TRUE,S,FUNNAM);
06900 I←INTSCAN(S,BREAK);
07000 SAY_WAIT;
07100 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
07200 SET_TOUCH(I);
07300 END"TOUCH";
07400
07500 BEGIN"CONO"
07600 IF (READV(XV,S,"ARRIVE DOES NOT EXIST") ∧ READV(YV,S,"DEPART DOES NOT EXIST"))
07700 THEN BEGIN
07800 GETNAME(TRUE,S,FUNNAM);
07900 I←INTSCAN(S,BREAK);
08000 GETNAME(TRUE,S,FUNNAM);
08100 J←INTSCAN(S,BREAK);
08200 SAY_WAIT;
08300 ARM_CONO(XV,YV,I,J);
08400 END;
08500 END "CONO";
08600
08700 BEGIN"END"
08800 SAY_WAIT;
08810 FOR I←1 STEP 1 UNTIL 10 DO SAVE_NAME[I]←NULL;
08855 MSN←0;
08900 CLOSE_TRAJECTORY;
09000 FILE←NULL;
09100 END"END";
09200
00100 IF LENGTH(FILE) THEN FLUSH(0,LAST_ARM);
00200
00300 BEGIN "PROCEED"
00400 SAY_WAIT;
00500 DO_PROCEED;
00600 AEF←TRUE;
00700 END"PROCEED";
00800
00900 BEGIN"PROTO"
01000 GETNAME(FALSE,S,VECTNAM);
01100 GLOBAL ERASE INSTANCE⊗ANY≡TEST_BLOCK;
01200 IF EQU(S,"WEDGE")THEN GLOBAL MAKE INSTANCE⊗WEDGE124≡TEST_BLOCK ELSE
01300 IF EQU(S,"RPP")THEN GLOBAL MAKE INSTANCE⊗RPP112≡TEST_BLOCK ELSE
01400 GLOBAL MAKE INSTANCE⊗CUBE≡TEST_BLOCK;
01500 END"PROTO";
01600
01700 BEGIN"FILE"
01800 GETNAME(FALSE,OFILE,VECTNAM);
02000 END"FILE";
02100
02200 BEGIN"I"
02300 IF ¬MAC ∧ CHAN=1 THEN FOR I←1 STEP 1 UNTIL 6 DO OUTSTR(CVF(ARM_VECTOR[I]));
02400 IF ¬MAC ∧ CHAN=1 THEN OUTSTR(CRLF);
02500 END"I";
02600
02700 BEGIN "MOVEINST"
02800 IF ¬READT(XT,S,"INSTANCE TRANSFORM DOSN'T EXIST")THEN GO TO GET;
02900 ARRTRAN ( GLOBAL DATUM(TEST_BLOCK),XT);
03000 IF ¬READT(XT,S,"NEW TRANSFORM DOSN'T EXIST")THEN GO TO GET;
03100 IF ¬READV(YV,S,"INTERMEDIATE POSITION DOSN'T EXIST")THEN GO TO GET;
03200 SAY_WAIT;
03300 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
03400 ISSUE(7,"HAND","MOVE",MESSAGE MOVE_INSTANCE(TEST_BLOCK,XT,YV,ARM_PLAN));
03500 IF ARM_PLAN ≤0 THEN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"SORRY "&CVS(ARM_PLAN)&CRLF)
03600 ELSE BEGIN
03700 IF ¬MAC ∧ CHAN=1 THEN OUTSTR(CVS(ARM_PLAN/2)&" MOVE"&CRLF);
03800 FOR I←1 STEP 1 UNTIL 3*ARM_PLAN DO
03900 QUEUE('600, GET_ENTRY('120,NULL,"HAND",NULL));
04000 END;
04100 END "MOVEINST";
04200
00100 BEGIN"LINK"
00200 SAFE OWN REAL ARRAY T[1:4,1:4];
00300 GETNAME(TRUE,S,FUNNAM);
00400 I←INTSCAN(S,BREAK);
00500 IF I<3 ∨ I>6 THEN BEGIN OUTSTR("THAT LINK IS NOT AVAILABLE"&CRLF);GO TO GET END;
00600 ARRBLT(T[1,1],ARM_LINK[I,1,1],16);
00700 T[1,4]←T[1,4]/TSX;
00800 T[2,4]←T[2,4]/TSY;
00900 IF ¬MAC ∧ CHAN=1 THEN PMAT(NULL,T);
01000 END"LINK";
01100
01200 IF ¬MAC ∧ CHAN=1 THEN OUTSTR(CVF(GRASP)&CRLF);
01300
01400 BEGIN"WEIGHT"
01500 PRELOAD_WITH 0,0,-1,0,0,0;SAFE OWN REAL ARRAY ONE_OZ[1:6];
01600 SAFE OWN REAL ARRAY TORQUE[1:6];
01700 INTEGER I; REAL WR,WO;
01800 LABEL FIND;
01900 FIND: FORCE(TORQUE,ONE_OZ);
02000 WR←WO←0;
02100 FOR I←1 STEP 1 UNTIL 6 DO BEGIN
02200 WR←WR+TORQUE[I]*TORQUE[I];
02300 WO←WO-ARM_TORQUE[I]*TORQUE[I];
02400 END;
02500 IF ¬MAC ∧ CHAN=1 THEN OUTSTR(CVF(WO/WR)&" OZS."&CRLF);
02600 END;"WEIGHT"
02700
02800 OUTSTR(CVS(ARM_TIME)&CRLF);
02900
03000 BEGIN "POS"
03100 SAFE OWN REAL ARRAY T[1:4,1:4];
03200 SAY_WAIT;
03300 ARM_POSITION;
03400 ARRBLT(T[1,1],ARM_LINK[6,1,1],16);
03500 T[1,4]←T[1,4]/TSX;
03600 T[2,4]←T[2,4]/TSY;
03700 IF ¬MAC ∧ CHAN=1 THEN PMAT(NULL,T);
03800 END "POS";
03900
04000 BEGIN"SKIPN"
04100 STRING SL;
04200 SL←SIMIO(ONE_LINE);
04300 I←CVO(SL);
04400 SAY_WAIT;
04500 ARM_SKIPN(I);
04600 GO TO GET1
04700 END"SKIPN";
04800
04900 BEGIN"SKIPS"
05000 STRING SL;
05100 SL←SIMIO(ONE_LINE);
05200 I←CVO(SL);
05300 SAY_WAIT;
05400 ARM_SKIPS(I);
05500 GO TO GET1
05600 END"SKIPS";
05700
00100 BEGIN "DEFINE"
00200 STRING ARRAY ARG[1:10];
00300 INTEGER TMN;
00400 I←GETNAME(FALSE,S,FUNNAM);
00500 IF LENGTH(FUNNAM[I]) THEN OUTSTR(S&" MACRO NAME RESERVED WORD"&CRLF);
00600 FOR TMN←1 STEP 1 UNTIL FMN DO IF EQU(S,MACRO_NAME[TMN]) THEN DONE;
00700 IF TMN>FMN THEN MACRO_NAME[TMN]←S;
00800 MACRO_FORMAL[TMN]←S←SIMIO(ONE_LINE);
00900 J←0;
01000 WHILE LENGTH(S)
01100 DO BEGIN SCAN(S,HEAD,BREAK);
01200 IF BREAK=";" THEN DONE;
01300 SL←SCAN(S,ID,BREAK);
01400 IF LENGTH(SL) THEN ARG[J←J+1]←SL END;
01500 PUSH_FORMAT(0,0);
01600 MACRO_DEFN[TMN]←NULL;
01700 WHILE TRUE
01800 DO BEGIN S←SIMIO(ONE_LINE);
01900 IF ¬LENGTH(S) THEN DONE;
02000 WHILE LENGTH(S) DO BEGIN
02100 SCAN(S,SOME,BREAK);
02200 IF BREAK=";" THEN DONE;
02300 IF "A" ≤ BREAK ≤ "Z"
02400 THEN BEGIN SL←SCAN(S,ID,BREAK);
02500 FOR I←1 STEP 1 UNTIL J
02600 DO IF EQU(SL,ARG[I])
02700 THEN BEGIN SL←"$"&CVS(I);
02800 DONE END;
02900 IF BREAK=":" THEN SL←SL&":";
03000 IF BREAK="+" ∨ BREAK="-" THEN S←BREAK&S END
03100 ELSE SL←SCAN(S,NNUMS,BREAK);
03200 MACRO_DEFN[TMN]←MACRO_DEFN[TMN]&SL&(IF LENGTH(S) THEN " " ELSE NULL);
03300 IF BREAK=";" THEN DONE;
03400 END;
03500 MACRO_DEFN[TMN]←MACRO_DEFN[TMN]&'15&'12;
03600 END;
03700 POP_FORMAT;
03800 OUTSTR(MACRO_NAME[TMN]&(IF TMN≤FMN THEN " REDEFINED" ELSE " DEFINED")&CRLF);
03900 IF TMN>FMN THEN FMN←TMN;
04000 GO TO GET1;
04100 END "DEFINE";
04200
00100 BEGIN "DUMP"
00200 STRING ARRAY ARG[1:10];
00300 OUTSTR("FILE NAME"&CRLF);
00400 SIMIO(HEAD);
00500 S←SIMIO(ID);
00600 IF BREAK="." THEN S←S&"."&SIMIO(ID) ELSE S←S&".HAL";
00700 IF BREAK="[" THEN S←S&"["&SIMIO(RSB);
00800 OPEN(CHAN←CHAN+1,"DSK",0,0,3,120,BREAK,EOF);
00900 ENTER(CHAN,S,EOF);
01000 FOR I←0 STEP 1 UNTIL '77 DO
01100 IF LENGTH(TRANSNAM[I]) THEN BEGIN
01200 OUT(CHAN,"TRANS "&TRANSNAM[I]&" ");
01300 ARRBLT(DIR[1],DATA_BASE[TRANSNUM[I],1],6);
01400 FOR J←1 STEP 1 UNTIL 6 DO OUT(CHAN,CVF(DIR[J]));
01500 OUT(CHAN,CRLF);
01600 END;
01700 OUT(CHAN,CRLF&CRLF);
01800 FOR I←0 STEP 1 UNTIL '77 DO
01900 IF LENGTH(VECTNAM[I]) ∧ VECTNUM[I] THEN BEGIN
02000 OUT(CHAN,"VECT "&VECTNAM[I]&" ");
02100 ARRBLT(DIR[1],DATA_BASE[VECTNUM[I],1],3);
02200 FOR J←1 STEP 1 UNTIL 3 DO OUT(CHAN,CVF(DIR[J]));
02300 OUT(CHAN,CRLF);
02400 END;
02500 OUT(CHAN,CRLF&CRLF);
02600 FOR I←1 STEP 1 UNTIL FMN DO BEGIN
02700 OUT(CHAN,"DEFINE "&MACRO_NAME[I]&" ");
02800 OUT(CHAN,S←MACRO_FORMAL[I]&"
02900 ");
03000 J←0;
03100 WHILE LENGTH(S)
03200 DO BEGIN SCAN(S,HEAD,BREAK);
03300 IF BREAK=";" THEN DONE;
03400 SL←SCAN(S,ID,BREAK);
03500 IF LENGTH(SL) THEN ARG[J←J+1]←SL END;
03600 S←MACRO_DEFN[I];
03700 WHILE LENGTH(S) DO BEGIN
03800 OUT(CHAN,SCAN(S,DOLLAR,BREAK));
03900 IF LENGTH(S) THEN OUT(CHAN,ARG[INTSCAN(S,BREAK)]&
03950 (IF BREAK='12 THEN '15 ELSE NULL));
04000 END;
04100 OUT(CHAN,CRLF&CRLF);
04200 END;
04300 RELEASE(CHAN);
04400 CHAN←CHAN-1;
04500 END "DUMP";
04600
00100 BEGIN"SET"
00200 LABEL L1;
00250 REAL DIST,DEG;
00275 INTEGER CELL;
00300 GETNAME(FALSE,S,VECTNAM);
00400 FOR CELL←1 STEP 1 UNTIL MSN DO IF EQU(S,SAVE_NAME[CELL]) THEN GO TO L1;
00500 FOR CELL←1 STEP 1 UNTIL 10 DO IF ¬LENGTH(SAVE_NAME[CELL])THEN GO TO L1;
00900 OUTSTR(FILE_NAME[CHAN]&LINE_NO&"NO FREE SAVE CELL"&CRLF);
01000 GO TO GET;
01100 L1: IF ¬READT(TT1,S,S&" TRANSFORM DOSN'T EXIST") THEN GO TO GET;
01500 IF ¬READV(XV,S,"DX DY DZ DOSN'T EXIST") THEN GO TO GET;
01600 J←0;
01700 IF EQU(S,"SWEEP")THEN J←2;
01800 IF EQU(S,"REACH")THEN J←3;
01900 IF EQU(S,"LIFT")THEN J←1;
02000 IF J THEN FOR I←1 STEP 1 UNTIL 3 DO XV[I]←TT1[J,I];
02200 GETNAME(TRUE,S,FUNNAM);
02300 DIST←REALSCAN(S,BREAK);
02400 IF ¬READV(YV,S,"AXIS DOSN'T EXIST")THEN GO TO GET;
02500 J←0;
02600 IF EQU(S,"TURN")THEN J←1;
02700 IF EQU(S,"TWIST")THEN J←3;
02800 IF EQU(S,"TILT")THEN J←2;
02900 IF J THEN FOR I←1 STEP 1 UNTIL 3 DO YV[I]←TT1[J,I];
03100 GETNAME(TRUE,S,FUNNAM);
03200 DEG←REALSCAN(S,BREAK);
03300 SCALE(XV,XV,DIST);
03400 SAY_WAIT;
03450 IF ¬(LENGTH(FILE) ∨ AEF) THEN START_TRAJECTORY ((FILE←OFILE),0);
03500 SET_ARM(CELL,TT1,XV,YV,DEG,ARM_PLAN);
04500 IF ¬ARM_PLAN THEN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"SORRY"&CRLF);
04510 SAVE_NAME[CELL]←S;
04520 IF CELL>MSN THEN MSN←CELL;
04900 END"SET";
05000
00100 IFC GRAPHICS THENC
00200 BEGIN "DISPLAY"
00300 SAFE INTEGER ARRAY DISPLY[1:'3000];
00400 LABEL TOP;
00500 INTEGER POG;
00600 SAFE INTEGER ARRAY FDATA[0:'2200];
00700 STRING SIMPLE PROCEDURE SCAN_DATA(INTEGER TL,TU;STRING IND;SIMPLE PROCEDURE UP);
00800 BEGIN INTEGER ERROR,TICK,REQD,THIS,N;
00900 INTEGER MISSED;
01000 BOOLEAN FIRST;
01100 LABEL NEXT;
01200 LOOKUP('17,DFILE&".TMP",EOF);
01300 IF EOF THEN RETURN("FILE NOT FOUND");
01400 REQD←CVSIX(IND);
01500 TICK←CVSIX("TICK");
01600 ERROR←CVSIX("ERROR");
01700 TIME←-1;
01800 FIRST←TRUE;
01900 MISSED←0;
02000 PTR←0;
02100 BP←0;
02200 HIT←0;
02300 ARRYIN('17,FDATA[0],'200);
02400 DO BEGIN "READ_LOOP"
02500 ARRYIN('17,FDATA['200],'2000);
02600 DO BEGIN "ITEM_LOOP"
02700 THIS←FDATA[PTR] LAND '777777777700;
02800 IF ¬THIS THEN RETURN(NULL);
02900 IF THIS=TICK THEN BEGIN
03000 MISSED←0;
03100 TIME←TIME+1;
03200 IF TIME<TL THEN GO TO NEXT;
03300 IF TIME>TU THEN RETURN(NULL);
03400 HIT←HIT+1;
03500 IF MODULUS<2 ∨ ¬(HIT MOD MODULUS) THEN BEGIN
03600 BUFFER[BP+1]←BUFFER[BP];
03700 BP←BP+1;
03800 END;
03900 END;
04000 IF THIS=REQD THEN BEGIN
04100 UP;
04200 IF FIRST THEN BEGIN
04300 BUFFER[1]←BUFFER[BP];
04400 ARRBLT(BUFFER[2],BUFFER[1],BP-2);
04500 FIRST←FALSE;
04600 END;
04700 END;
04800 NEXT: IF(N←FDATA[PTR] LAND '77)>'37 ∨ THIS=ERROR THEN
04900 BEGIN MISSED←-1;
05000 OUTSTR(CVS(TIME)&" DATA MISSED");
05100 END;
05200 PTR←PTR+1+(IF MISSED THEN 0 ELSE N);
05300 END UNTIL PTR>'1777;
05400 PTR←PTR-'2000;
05500 ARRBLT(FDATA[0],FDATA['2000],'200);
05600 END UNTIL EOF;
05700 RETURN("END OF FILE");
05800 END"SCAN_DATA";
05900
06000 PROCEDURE WHEN;
06100 BEGIN
06200 INTEGER I;
06300 PRELOAD_WITH "OPEN_HAND","CLOSE_HAND","WAIT_ARM","PLACE_ARM","CHANGE_ARM","SET_TOUCH","FORCE_ARM";
06400 SAFE OWN STRING ARRAY FUNCTION[1:7];
06500 IF (I←FDATA[PTR+1] LAND '777777) THEN SM←SM&CVS(TIME)&" "&FUNCTION[I]&CRLF ELSE
06600 IF FDATA[PTR+1] LAND '10000000 THEN SM←SM&CVS(TIME)&" "&"NULL_ARM"&CRLF ELSE
06700 IF FDATA[PTR+1] LAND '20000000 THEN SM←SM&CVS(TIME)&" "&"MOVE_ARM"&CRLF;
06800 END;
06900
07000 SIMPLE PROCEDURE REAL6;
07100 BEGIN
07200 INTEGER I;
07300 REAL R;
07400 I←FDATA[PTR+7-INDEX];
07500 START_CODE MOVE 1,I;FMPR 1,FACTOR;MOVEM 1,R END;
07600 BUFFER[BP]←R;
07700 END;
07800
07900 SIMPLE PROCEDURE REAL1;
08000 BEGIN
08100 INTEGER I;
08200 REAL R;
08300 I←FDATA[PTR+1];
08400 START_CODE MOVE 1,I;FMPR 1,FACTOR;MOVEM 1,R END;
08500 BUFFER[BP]←R;
08600 END;
08700
08800 SIMPLE PROCEDURE INT1;BUFFER[BP]←FDATA[PTR+1];
08900
09000 SIMPLE PROCEDURE INT6;
09100 BUFFER[BP]←FDATA[PTR+7-INDEX];
09200
09300 PROCEDURE BIGHT;
09400 BEGIN LABEL FOUND;
09500 INTEGER BITE,T,I,J,K;
09600 SAFE INTEGER ARRAY FEEL[1:2,1:2,1:4];
09700 START_CODE
09800 HRRZI 1,FDATA;
09900 HRR 1,(1);
10000 ADD 1,PTR;
10100 HRLI 1,'1400;
10200 MOVEM 1,BITE;
10300 END;
10400 FOR I←2 STEP -1 UNTIL 1 DO BEGIN"FINGER"
10500 FOR J←2 STEP -1 UNTIL 1 DO
10600 FOR K←4 STEP -1 UNTIL 1 DO
10700 IF INDEX=I ∧ TIP=J ∧ PAD=K THEN
10800 BEGIN"THE ONE"
10900 T←ILDB(BITE);
11000 START_CODE
11100 LABEL POS,BACK;
11200 MOVE 1,T;
11300 TRNE 1,'2000;
11400 JRST POS;
11500 TRZ 1,'774000;
11600 JRST BACK;
11700 POS: TDO 1,NMASK;
11800 BACK: MOVNM 1,T;
11900 END;
12000 GO TO FOUND;
12100 END "THE ONE" ELSE IBP(BITE);
12200 IBP(BITE);
12300 END "FINGER";
12400 FOUND: BUFFER[BP]←T;
12500 END;
12600 STRING SL;
00100 SL←SIMIO(ONE_LINE);
00200 SCAN(SL,HEAD,BREAK);
00300 IF ¬LENGTH(DFILE←SCAN(SL,ID,BREAK)) THEN DFILE←OFILE;
00400 OPEN('17,"DSK",'17,0,0,120,BREAK,EOF);
00500 MODULUS←1000;
00600 SM←"
00700 TIME FUNCTION"&CRLF;
00800 SETFORMAT(4,0);
00900 S11←SCAN_DATA(0,5000,"NEXT",WHEN);
01000 SM←SM&CVS(TIME)&" "&S11&CRLF;
01100 OUTSTR(SM);
01200 OUTSTR("DISPLAY, FUNCTION, FROM, TO ?"&CRLF);
01300 SETFORMAT(0,0);
01400 WHILE TRUE DO BEGIN
01500 INPUT(1,HEAD);S11←INPUT(1,ID);
01600 IF EQU(S11,"X") THEN DONE;
01700 IF EQU(S11,"N") THEN BEGIN RELEASE('17);GO TO GET END;
01800 IF EQU(S11,"C") THEN BEGIN DPYCLR;RELEASE('17);GO TO GET END;
01900 IF EQU(S11,"P") THEN BEGIN
02000 STRING FILNAM;
02100 INTEGER FLG,CHN;
02200 CHN ← 14;
02300 OPEN(CHN,"DSK",8,0,3,0,0,0);
02400 DO BEGIN
02500 OUTSTR(13&10&"PLOT FILE = ");
02600 FILNAM ← INCHWL;
02700 ENTER(CHN,FILNAM&".PLT",FLG);
02800 END UNTIL ¬FLG;
02900 ARRYOUT(CHN,DISPLY[1],DISPLY[2]);
03000 RELEASE(CHN);
03100 GO TO TOP;
03200 END;
03300 INPUT(1,HEAD);FUNCTION←INPUT(1,ID);
03400 IF EQU(S11,"D")THEN BEGIN
03500 LL←INTIN(1);
03600 UL←INTIN(1);
03700 MODULUS←1+(UL-LL)%100;
03800 DPYCLR;
03900 POG←GETPOG;
04000 DPYSET(DISPLY);
04100 AIVECT(-511,450);
04200 END;
04300 IF EQU(FUNCTION,"THETA")THEN BEGIN
04400 OUTSTR("INDEX ?"&CRLF);
04500 INDEX←INTIN(1);
04600 FACTOR←THFAC[INDEX];
04700 SCAN_DATA(LL,UL,"THETA",REAL6);
04800 ARRGRF(BUFFER,1,BP,-300,-300,800,700,"T/"&CVS(MODULUS),
04900 "ERROR "&CVS(INDEX)&" FROM "&CVS(LL)&" TO "&CVS(UL));
05000 DPYOUT(POG);
05100 GO TO TOP;
05200 END;
05300
05400 IF EQU(FUNCTION,"MOTOR")THEN BEGIN
05500 OUTSTR("INDEX ?"&CRLF);
05600 INDEX←INTIN(1);
05700 SCAN_DATA(LL,UL,"DAC",INT6);
05800 FOR I←1 STEP 1 UNTIL BP DO BUFFER[I]←BUFFER[I]*300/'776000;
05900 ARRGRF(BUFFER,1,BP,-300,-300,800,700,"T/"&CVS(MODULUS),
06000 "MOTOR "&CVS(INDEX)&" FROM "&CVS(LL)&" TO "&CVS(UL));
06100 DPYOUT(POG);
06200 GO TO TOP;
06300 END;
06400 IF EQU(FUNCTION,"DRIVE")THEN BEGIN
06500 OUTSTR("INDEX ?"&CRLF);
06600 INDEX←7-INTIN(1);
06700 FACTOR←10.0;
06800 SCAN_DATA(LL,UL,"BACK",REAL6);
06900 ARRGRF(BUFFER,1,BP,-300,-300,800,700,"T/"&CVS(MODULUS),
07000 "DRIVE "&CVS(7-INDEX)&" FROM "&CVS(LL)&" TO "&CVS(UL));
07100 BP←HIT←0;
07200 SCAN_DATA(LL,UL,"FORD",REAL6);
07300 ARRGRF(BUFFER,1,BP,-300,-300,0,700,"T/"&CVS(MODULUS),
07400 "DRIVE "&CVS(7-INDEX)&" FROM "&CVS(LL)&" TO "&CVS(UL));
07500 DPYOUT(POG);
07600 GO TO TOP;
07700 END;
07800 IF EQU(FUNCTION,"HAND")THEN BEGIN
07900 FACTOR←100.0;
08000 SCAN_DATA(LL,UL,"HAND",REAL1);
08100 ARRGRF(BUFFER,1,BP,-300,-300,800,700,"T/"&CVS(MODULUS),
08200 "HAND FROM "&CVS(LL)&" TO "&CVS(UL));
08300 DPYOUT(POG);
08400 GO TO TOP;
08500 END;
08600 IF EQU(FUNCTION,"TIME")THEN BEGIN
08700 SCAN_DATA(LL,UL,"TICK",INT1);
08800 ARRGRF(BUFFER,1,BP,-300,-300,800,700,"T/"&CVS(MODULUS),
08900 "TIME FROM "&CVS(LL)&" TO "&CVS(UL));
09000 DPYOUT(POG);
09100 GO TO TOP;
09200 END;
09300 IF EQU(FUNCTION,"TOUCH")THEN BEGIN
09400 OUTSTR("FINGER, TIP ?"&CRLF);
09500 INDEX←INTIN(1);
09600 TIP←INTIN(1);
09700 FOR PAD←1 STEP 1 UNTIL 4 DO BEGIN
09800 SCAN_DATA(LL,UL,"TOUCH",BIGHT);
09900 ARRGRF(BUFFER,1,BP,-300,-300+(PAD-1)*180,800,150,"T/"&CVS(MODULUS),
10000 "TOUCH FROM "&CVS(LL)&" TO "&CVS(UL));
10100 END;
10200 DPYOUT(POG);
10300 GO TO TOP;
10400 END;
10500 OUTSTR("UNRECOGINZED COMMAND"&CRLF);
10600 TOP:END;
10700 END"DISPLAY";
10800 ENDC
10900
00100 END ELSE
00200 BEGIN
00300 FOR I←1 STEP 1 UNTIL FMN DO IF EQU(S,MACRO_NAME[I])
00400 THEN BEGIN
00500 S←SIMIO(ONE_LINE);
00600 OUTSTR(MACRO_NAME[I]&CRLF);
00700 MAC←MAC+1;
00800 MACRO_SOURCE[MAC]←MACRO_DEFN[I];
00900 MAC_TOP[MAC]←MAC_FREE;
01000 WHILE LENGTH(S) DO BEGIN
01100 SCAN(S,SOME,BREAK);
01200 IF BREAK="$"
01300 THEN BEGIN I←INTSCAN(S,BREAK);
01400 I←I+MAC_TOP[MAC-1];
01500 IF I<1 ∨ I> MAC_TOP[MAC]
01600 THEN BEGIN OUTSTR(FILE_NAME[CHAN]&LINE_NO&"MACRO PARAMETER OUT OF RANGE"&'15&'12);
01700 GO TO GET END;
01800 SL←MAC_PAR[I] END
01900 ELSE SL←IF "A"≤ BREAK ≤"Z" THEN SCAN(S,ID,I) ELSE SCAN(S,NNUMS,I);
02000 IF LENGTH(SL) THEN MAC_PAR[MAC_FREE←MAC_FREE+1]←SL END;
02100 BBEG[MAC]←PTR3+1;
02200 LLAB[MAC]←FREEL+1;
02300 GO TO GET1;
02400 END;
02500
02600 OUTSTR(FILE_NAME[CHAN]&LINE_NO&"UNRECOGINIZED COMMAND"&CRLF);
02700 END;
02800 GO TO GET;
02900 ENDC
03000 END;
03100